<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /* 

            当我们写构造函数的时候  
            属性(静态的)写在函数体内  
            动态的方法写在构造函数的原型上 


            什么是原型? 

            每个函数天生自带一个属性  叫做 prototype 是个对象数据结构 
            每个对象天生自带一个属性  叫做 __proto__ 注意两个下划线

            这个__proto__指向所属构造函数的prototype(原型)

            function Test666(){   //构造函数

            }
            var o2 = new Test666();  // 对象 

            Test666 天生自带属性 prototype
            o2 天生自带属性 __proto__ 


            o2的 __proto__ 指向 Test666 的 prototype

        
        */

        // function test1(){
        //     return 666;
        // }

        // console.log(test1.prototype);


        // var obj = {

        // }

        // console.log(obj);


        // function Haha(name){
        //     this.name;
            
        // }


        // var h1 = new Haha();

        // console.log( h1.__proto__ === Haha.prototype); 
        //true


        // Haha创建的任何对象的 __proto__ 都指向 Haha.prototype

        // Haha.prototype 就是 所有对象的公共空间  

        // 如果我们在构造函数体内 给一个属性赋值一个函数
        // 每次实例化对象 都要开辟一个新的空间 很浪费  
        // 既然所有的对象的__proto__ 都指向 构造函数的prototype
        // 我们可以在prototype写一个函数  开辟一个 
        // 所有的对象都用这一个函数(空间) 避免 每次都开一个新的空间 

        /* 
            function Haha(name){
                this.name;
                this.eat = function(){}
            }

        
        
        */


        // 改良方案  

        function Haha(name){
                this.name;
        }

        Haha.prototype.eat = function(){
            console.log('正在吃')
        }


        var o1 = new Haha('张三');
        o1.eat(); //先看自己身上有没有 eat 没有就到 o1.__proto__ 
        //  o1.__proto__  ==   Haha.prototype 
        // 来到了   Haha.prototype  
        //   Haha.prototype 上面有 eat 直接用  
        var o2 = new Haha('张三2');
        o2.eat()
        var o3 = new Haha('张三3');
        o3.eat()
        var o4 = new Haha('张三4');
        o4.eat()


        // 当我们实例化一个对象 并且访问他 首先先在自己身上找 ,如果有直接用
        // 如果没有 就到自己的__proto__上面找  自己的__proto__ 等于 构造函数的prototype
    </script>
</body>
</html>